import 'package:flutter/foundation.dart';

import '../db/dao/ses_dao.dart';
import '../utils/listerer.dart';

/// 会话事件
enum SesEvent {
  add,
  update,
  remove,
}

/// 会话管理
class SesHelper {
  factory SesHelper() {
    _singleton ??= SesHelper._();
    return _singleton!;
  }

  static SesHelper? _singleton;

  SesHelper._();

  /// 路由堆栈
  SessionStack stack = SessionStack();
  final ListenerManager<(SesEvent, SesInfo)> _controller = ListenerManager();

  /// 新增操作
  void add(SesInfo session) {
    _controller.add((SesEvent.add, session));
  }

  /// 更新操作
  void update(SesInfo session) {
    if (stack.peek()?.session.id == session.session.id) {
      stack.update(session);
    }
    _controller.add((SesEvent.update, session));
  }

  /// 删除操作
  void remove(SesInfo session) {
    _controller.add((SesEvent.remove, session));
  }

  /// 监听
  VoidCallback listen(void Function((SesEvent, SesInfo)) onData) {
    _controller.listener(onData);
    return () => _controller.remove(onData);
  }
}

/// 会话栈
class SessionStack {
  final List<SesInfo> _stack = [];

  /// 清空
  void clear() {
    _stack.clear();
  }

  /// 判断会话栈中是否存在某个会话
  bool has(String id) {
    return _stack.where((element) => element.session.id == id).isNotEmpty;
  }

  /// 是否为空
  bool isEmpty() {
    return _stack.isEmpty;
  }

  /// 取出栈顶元素
  SesInfo? peek() {
    return _stack.isEmpty ? null : _stack.last;
  }

  /// 删除并返回栈顶元素
  SesInfo? pop() {
    return _stack.isNotEmpty ? _stack.removeLast() : null;
  }

  /// 向栈顶添加元素
  void push(SesInfo item) {
    _stack.add(item);
  }

  /// 更新
  void update(SesInfo item) {
    for (var i = 0; i < _stack.length; i++) {
      if (_stack[i].session.id == item.session.id) {
        _stack[i] = item;
      }
    }
  }

  /// 深度
  int size() {
    return _stack.length;
  }
}
